package 数组;

import java.util.ArrayList;
import java.util.List;

/**
 * 力扣：59
 *
 * @Author zxl
 * @Date 2022/1/2 10:56
 * @Desc 给出一个正整数n，按照从外到内的螺旋顺序打印1到n^2的所有数值
 * 例如：输入：3；输出：
 * [
 * [1,2,3],
 * [8,9,4],
 * [7,6,5],
 * ]
 */
public class 螺旋矩阵 {


    public static void main(String[] args) {

        Integer[][] array = printArray(5);
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array.length; j++) {
                System.out.print(array[i][j] + "\t");
            }
            System.out.println();
        }
    }

    public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> list = new ArrayList<>();
        // 初始边界
        int left = 0, right = matrix[0].length - 1;
        int top = 0, bottom = matrix.length - 1;
        int size = matrix.length * matrix[0].length;
        while (list.size() != size) {
            // 上遍历
            for (int i = left; i <= right; i++) {
                list.add(matrix[top][i]);
            }
            top++;
            if (top > bottom) {
                break;
            }
            for (int i = top; i <= bottom; i++) {
                list.add(matrix[i][right]);
            }
            right--;
            if (left > right) break;
            //下层遍历
            for (int i = right; i >= left; i--) {
                list.add(matrix[bottom][i]);
            }
            bottom--;
            if (top > bottom) break;
            //左层遍历
            for (int i = bottom; i >= top; i--) {
                list.add(matrix[i][left]);
            }
            left++;
            if (left > right) break;
        }
        return list;
    }

    /**
     * 圈圈
     *
     * @param n
     * @return
     */
    public static Integer[][] printArray(int n) {
        Integer[][] array = new Integer[n][n];
        // 起始位置
        int startX = 0, startY = 0;
        // 循环次数
        int loop = n / 2;
        // 中间坐标
        int mind = n / 2;
        // 计数器
        int count = 1;
        // 一条边遍历长度的差
        int offset = 1;
        // 横纵坐标
        int i, j;
        // 开始遍历：左闭右开
        while (loop-- > 0) {
            i = startX;
            j = startY;
            // 上行遍历
            for (; j < startY + n - offset; j++) {
                array[i][j] = count++;
            }
            // 遍历右行
            for (; i < startX + n - offset; i++) {
                array[i][j] = count++;
            }
            // 遍历下行
            for (; j > startY; j--) {
                array[i][j] = count++;
            }
            // 遍历右行
            for (; i > startX; i--) {
                array[i][j] = count++;
            }

            // 下一次循环
            startX++;
            startY++;
            offset += 2;
        }
        if (n % 2 == 1) {
            array[mind][mind] = count;
        }
        return array;

    }

}
